const Koa = require('koa');
const { koaBody } = require('koa-body');
const http = require('http');
const cors = require('koa2-cors');
const koajwt = require('koa-jwt');
const path = require('path');
const { routerInstaller } = require('./utils/installer');
const errorHandler = require('./error');
const config = require('./config');
const serve = require('koa-static');
const app = new Koa();

// 初始化 WebSocket 实例
const WebSocketManager = require('./service/common/websocket-util');
const server = http.createServer(app.callback());
WebSocketManager.init(server);

app.use(
  cors({
    origin: '*', //允许所有域名访问
    credentials: true, // 允许携带认证信息（如cookies）
    exposeHeaders: ['filename'] // 下载文件时，响应头中包含filename
  })
);

/**
 * 中间件处理
 * 1. Cookie令牌验证。
 * 2. 参数、请求地址打印，通过monitor排查错误日志。
 * 3. 拦截通过throw抛出的异常。
 */
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    if (err.name === 'UnauthorizedError') {
      ctx.body = {
        code: 10018,
        data: '',
        message: 'TOKEN 无效，请重新登录' // 自定义错误信息
      };
      return;
    } else if (err.message.indexOf('options.maxFileSize') > -1) {
      ctx.body = {
        code: 102,
        data: '',
        message: '超出最大限制，文件最大为200M' // 自定义错误信息
      };
      return;
    } else {
      ctx.body = {
        code: -1,
        data: '',
        message: err.message
      };
    }
  }
});

app.use(
  koaBody({
    parsedMethods: ['POST', 'PUT', 'DELETE', 'GET'], // 显式支持 DELETE
    json: true, // 支持 JSON 请求体
    multipart: true,
    formidable: {
      uploadDir: path.join(__dirname, 'upload'),
      maxFileSize: 200 * 1024 * 1024, // 200M
      keepExtensions: true,
      allowEmptyFiles: false, // 允许上传空文件
      maxFiles: 1 // 设置同时上传文件的个数
    }
  })
);
// 配置静态文件服务
app.use(
  serve(path.join(__dirname, 'upload'), {
    setHeaders: res => {
      res.setHeader('Content-Disposition', 'attachment'); // 强制下载
    }
  })
);

// token 鉴权
/* app.use(
  koajwt({ secret: config.JWT_SECRET }).unless({
    path: [
	 /^\/ws/, 
      /^\/api\/system\/login/,
      /^\/api\/system\/captcha/,
      /^\/api\/user\/sendEmail/,
      /^\/api\/user\/regist/,
      /^\/api\/admin\/page\/detail/,
      /^\/api\/ai\/proxy/,
      /^\/api\/firefly/,
    ],
  }),
); */

routerInstaller(app);

app.on('error', errorHandler);

module.exports = app;
